package syan.label.common;

import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * 汉印打印数据集
 *
 * @author <a href="mailto:xiongliyi@hichain.com">Ian Xiong</a>
 * @since 3.3.5
 */
@NoArgsConstructor
@AllArgsConstructor
@Data
public class HprtPrintItemVO {

    /**
     * 对齐方式[CENTER|LEFT|RIGHT]
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public AlignTypeEnum align = AlignTypeEnum.LEFT;
    /**
     * 起始点的横坐标
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public Integer x;
    /**
     * 起始点的纵坐标
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public Integer y;
    /**
     * 字体大小
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public Integer size = 0;
    /**
     * 文本数据。
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public String data;
    /**
     * 是否加粗字体
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public Boolean bold = Boolean.FALSE;
    /**
     * barcode 专用属性
     * 一维码的类型  39  128
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public String barCodeType = "128";
    /**
     * 打印速度 0-5
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public Integer speed = 4;
    /**
     * 一行打印的宽度。（单位：PX）
     * 【Width】
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public Integer Width = 4;
    /**
     * 宽的放大倍数
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public Integer magWidth = 1;
    /**
     * 高的放大倍
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public Integer magHeight = 1;
    /**
     * 位图宽 e.g. 1
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public String bitMapWidth;
    /**
     * 位图高 e.g. 1
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public String bitMapHeight;
    /**
     * 图片算法。0：二值算法；1：半色调算法。 e.g. 0
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public String bitMapType;
    /**
     * 位图亮度  e.g. 0
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public String bitMapLight;
    /**
     * barcode 专用属性
     * 宽条窄条的比例
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public Integer barCodeRatio = 1;
    /**
     * barcode 专用属性
     * 条码宽度
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public Integer barCodeWidth = 1;
    /**
     * barcode 专用属性
     * 条码高度
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public Integer barCodeHeight = 50;
    /**
     * barcode 专用属性
     * 条码下方的数据是否可见。ture：可见，false：不可见
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public Boolean barCodeUnderText = Boolean.FALSE;
    /**
     * barcode 专用属性
     * 字体类型
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public String barCodeNumber = "7";
    /**
     * barcode 专用属性
     * 条码与文字间的距离。
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public String barCodeOffset = "5";
    /**
     * qrcode 专用属性
     * QR 的类型：类型 1 和类型 2；类型 2 是增加了个别的符号，提供了而外的功 能。
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public String qrType = "2";
    /**
     * qrcode 专用属性
     * 单位宽度/模块的单元高度。 范围是 1 到 32 默认为 6。
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public String qrUnit = "6";
    /**
     * 加粗。
     *
     * @return
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public Boolean isbole = Boolean.TRUE;
    /**
     * 放大两倍字体。
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public Boolean isdouble = Boolean.TRUE;
    /**
     * 要打印的文本
     *
     * @return
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public String Str;
    /**
     * bitmap 行数
     * bitmap 行数
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    public String bitMapRows;
    /**
     * 设置类型（前端传入）
     * <li>APP: px</li>
     * <li>PC: mm</li>
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private String printUnit;
    /**
     * 打印类型
     *
     * @see PrintTypeEnum
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private PrintTypeEnum printType = PrintTypeEnum.TEXT;
    /**
     * 执行类型
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private CommandTypeEnum command = CommandTypeEnum.TEXT;
    /**
     * 字体：
     * <li>0：12x24。</li>
     * <li>1：12x24（中文模式下打印繁体），英文模式下字体变成（9x17）大小</li>
     * <li>2：8x16。</li>
     * <li>3：20x20。</li>
     * <li>4：32x32 或者 16x32，由 ID3 字体宽高各放大两倍。</li>
     * <li>7：24x24 或者 12x24，视中英文而定。</li>
     * <li>8：24x24 或者 12x24，视中英文而定。</li>
     * <li>20：16x16 或者 8x16，视中英文而定。</li>
     * <li>24：24x24 或者 12x24，视中英文而定。</li>
     * <li>55：16x16 或者 8x16，视中英文而定。</li>
     * <li>其它默认 24x24 或者 12x24，视中英文而定。</li>
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Integer font = 4;
    /**
     * 是否显示条形码文本 0：不打印，1：打印
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Boolean readable = Boolean.FALSE;
    /**
     * 二维码 窄体
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Integer narrow = 2;
    /**
     * 二维码 宽体
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Integer wide = 2;
    /**
     * 二维码参数 宽度
     */
    @JsonInclude(JsonInclude.Include.NON_NULL)
    private Integer qrCodeWidth = 3;

    /**
     * 打印二维码
     *
     * @param printType     打印类型
     * @param commandType   命令类型
     * @param align         对齐方式
     * @param x             横坐标
     * @param y             纵坐标
     * @param font          字体大小
     * @param bold          是否加粗字体
     * @param data          打印内容
     * @param barCodeHeight 条码的高度
     * @param barCodeWidth  条码宽度
     * @param barCodeRatio  宽条窄条的比例
     */
    public HprtPrintItemVO(PrintTypeEnum printType, CommandTypeEnum commandType, AlignTypeEnum align,
                           Integer x, Integer y, Integer font, Boolean bold, String data,
                           Integer barCodeHeight, Integer barCodeWidth, Integer barCodeRatio) {
        this.printType = printType;
        this.command = commandType;
        this.align = align;
        this.font = font;
        this.x = x;
        this.y = y;
        this.bold = bold;
        this.data = data;
        this.barCodeHeight = barCodeHeight;
        this.barCodeRatio = barCodeRatio;
        this.barCodeWidth = barCodeWidth;
    }

    /**
     * 文字打印
     *
     * @param printType   打印类型
     * @param commandType 命令类型
     * @param align       对齐方式
     * @param x           横坐标
     * @param y           纵坐标
     * @param font        字体大小
     * @param bold        是否加粗字体
     * @param data        打印内容
     */
    public HprtPrintItemVO(PrintTypeEnum printType, CommandTypeEnum commandType, AlignTypeEnum align, Integer x, Integer y, Integer font, Boolean bold, String data) {
        this(printType, commandType, align, x, y, font, bold, data, null, null, null);
    }

    /**
     * 文字打印
     *
     * @param printType   打印类型
     * @param commandType 命令类型
     * @param align       对齐方式
     * @param x           横坐标
     * @param y           纵坐标
     * @param font        字体大小
     * @param data        打印内容
     */
    public HprtPrintItemVO(PrintTypeEnum printType, CommandTypeEnum commandType, AlignTypeEnum align, int x, int y, Integer font, String data) {
        this(printType, commandType, align, x, y, font, null, data);
    }

    public String getBold() {
        if (bold != null) {
            return bold ? "1" : "0";
        }
        return null;
    }

    public String getPrintType() {
        return printType.name;
    }

    public String getCommand() {
        return command.name;
    }

    public String getFont() {
        if (font != null) {
            return String.valueOf(font);
        }
        return null;
    }

    public String getQrCodeWidth() {
        if (qrCodeWidth != null) {
            return String.valueOf(qrCodeWidth);
        }
        return null;
    }

    public String getReadable() {
        return readable ? "1" : "0";
    }

    public String getPrintUnit() {
        return printUnit;
    }

    public String getNarrow() {
        if (narrow != null) {
            return String.valueOf(narrow);
        }
        return null;
    }

    public String getWide() {
        if (wide != null) {
            return String.valueOf(wide);
        }
        return null;

    }

    public String getSize() {
        return converterCoordinate(size);
    }

    public String getX() {
        return converterCoordinate(x);
    }

    public String getY() {
        return converterCoordinate(y);
    }

    public String getAlign() {
        return align.name();
    }

    public String getSpeed() {
        if (speed != null) {
            return String.valueOf(speed);
        }
        return null;
    }

    public String getWidth() {
        return converterCoordinate(Width);
    }

    public String getBarCodeRatio() {
        if (barCodeRatio != null) {
            return String.valueOf(barCodeRatio);
        }
        return null;
    }

    public String getBarCodeWidth() {
        if (barCodeWidth != null) {
            return String.valueOf(barCodeWidth);
        }
        return null;
    }

    public String getBarCodeHeight() {
        if (barCodeHeight != null) {
            return String.valueOf(barCodeHeight);
        }
        return null;

    }

    public String converterCoordinate(Integer value) {
        if (value == null) {
            return null;
        }
        if (printUnit == null) {
            return String.valueOf(value);
        }

        switch (printUnit) {
            case "mm":
            case "PC":
                return String.valueOf(value);
            case "px":
            case "APP":
                return String.valueOf(value * 8);
            default:
                return String.valueOf(value);
        }
    }

    public void cleanPropertiesWithOutText() {
        // 移除一维、二维码打印属性
        this.barCodeRatio = null;
        this.barCodeHeight = null;
        this.barCodeUnderText = null;
        this.barCodeOffset = null;
        this.barCodeNumber = null;
        this.barCodeType = null;
        this.barCodeWidth = null;

        this.qrType = null;
        this.qrUnit = null;
        this.qrCodeWidth = null;
        this.narrow = null;
        this.wide = null;

        this.bitMapHeight = null;
        this.bitMapRows = null;
        this.bitMapWidth = null;
        this.bitMapType = null;
        this.bitMapLight = null;

    }

    /**
     * 对齐方式
     */
    @AllArgsConstructor
    public enum AlignTypeEnum {
        CENTER("CENTER"), LEFT("LEFT"), RIGHT("RIGHT");

        private final String type;
    }

    /**
     * 打印类型
     */
    @AllArgsConstructor
    public enum PrintTypeEnum {
        /**
         * 文本
         */
        TEXT("TEXT"),
        /**
         * 文本框内居中显示
         */
        AutCenter("AutCenter"),
        /**
         * 文本自动换行
         */
        AutLine("AutLine"),
        /**
         * 一维码
         */
        BARCODE("BARCODE"),
        /**
         * 二维码
         */
        QRCODE("QRCODE"),
        /**
         * 位图
         */
        BITMAP("BITMAP"),
        /**
         * pdf图片
         */
        PDF("PDF");

        private final String name;
    }

    /**
     * 执行类型
     */
    @AllArgsConstructor
    public enum CommandTypeEnum {
        /**
         * 文本
         */
        TEXT("T"),
        /**
         * 文本 90
         */
        TEXT90("T90"),
        /**
         * 文本 180
         */
        TEXT180("T180"),
        /**
         * 文本 270
         */
        TEXT270("T270"),
        /**
         * 水平方向
         */
        BARCODE("BARCODE"),
        /**
         * 垂直方向
         */
        VBARCODE("VBARCODE"),
        /**
         * 位图
         */
        BITMAP90("BITMAP90");

        private final String name;
    }
}
